package com.atwulidun.visitor14;
// 定义被访问者为账单
public abstract class Bill {
    // 账单的金额
    protected double amount;
    // 账单的描述
    protected String des;

    public Bill(double amount, String des) {
        this.amount = amount;
        this.des = des;
    }

    public double getAmount() {
        return amount;
    }

    public void setAmount(double amount) {
        this.amount = amount;
    }

    public String getDes() {
        return des;
    }

    public void setDes(String des) {
        this.des = des;
    }

    // 接收访问者的抽象方法
    public abstract void accept(AccountBookViewer accountBookViewer);
}

// 具体账单有两种类型：收入账单和支出账单，每种类型账单又可以有多种不同对象
// 收入账单
class IncomeBill extends Bill {
    public IncomeBill(double amount, String des) {
        super(amount,des);
    }

    @Override
    // 这里用到了双分派：即先给IncomeBill对象分配一个访问者，作为accept方法的入参传入，这是第一次分派；
    // 再给IncomeBill对象分配该访问者中的某个方法来处理这个对象，这是第二次分派。
    public void accept(AccountBookViewer accountBookViewer) {
        accountBookViewer.view(this);
    }
}
// 支出账单
// 收入账单
class ConsumptionBill extends Bill {
    public ConsumptionBill(double amount, String des) {
        super(amount,des);
    }

    @Override
    // 这里用到了双分派：即先给ConsumptionBill对象分配一个访问者，作为accept方法的入参传入，这是第一次分派；
    // 再给ConsumptionBill对象分配该访问者中的某个方法来处理这个对象，这是第二次分派。
    public void accept(AccountBookViewer accountBookViewer) {
        accountBookViewer.view(this);
    }
}